import $util from '@/utils/util'
const fm = {
  // 不允许为空或者全为空白字符
  notBlank: function(rule, value) {
    return $util.isNotBlank(value)
  },
  // 不允许为空或者全为空白字符
  listNotBlank: function(rule, arr) {
    return arr != null && arr.length > 0
  },
  // 不允许为空（可以为空白字符）
  notEmpty: function(rule, value) {
    return !$util.isEmpty(value)
  },
  // 最大长度校验
  maxLen: function(rule, value, n) {
    const len = value == null ? 0 : value.length
    return len <= n
  },
  // 数字
  integer: function(rule, value) {
    const v = value + ''
    return /^[0-9]*$/.test(v)
  },
  positive: function(rule, value) {
    const v = value + ''
    return /^[1-9]+[0-9]*$/.test(v)
  },
  // 数字（可为空）
  integer_empty: function(rule, value) {
    return !fm.notEmpty(rule, value) || fm.integer(rule, value)
  },
  // 手机号
  phone: function(rule, value) {
    return /^1[3456789]\d{9}$/.test(value)
  },
  // 手机号（可为空）
  phone_empty: function(rule, value) {
    return !fm.notEmpty(rule, value) || fm.phone(rule, value)
  },
  // 邮箱
  email: function(rule, value) {
    return /^\w+([-\.]\w+)*@\w+([-\.]\w+)*\.\w+([-\.]\w+)*$/.test(value)
  },
  // 邮箱（可为空）
  email_empty: function(rule, value) {
    return !fm.notEmpty(rule, value) || fm.email(rule, value)
  },
  ip:function(rule,value){
    return  /^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$/.test(value);
  },
  ip_empty:function(rule,value){
    return  !fm.notEmpty(rule, value) || fm.ip(rule, value);
  },
  // 字母
  letter: function(rule, value) {
    return new RegExp('^[A-Za-z]+$').test(value)
  },
  // 字母或下划线开头的英文字符
  letter_number: function(rule, value) {
    return /^\w+$/.test(value)
  },
  // 以字母开头
  letter_first: function(rule, value) {
    return /^[A-Za-z]+.*$/.test(value)
  },
  // 以字母、下划线开头
  letter__first: function(rule, value) {
    return /^[A-Za-z_]+.*$/.test(value)
  }
}

export const validator = function(fn, o) {
  return function(rule, value, callback) {
    let func
    if (typeof fn === 'string') {
      func = fm[fn]
    } else if (typeof fn === 'function') {
      func = fn
    }
    const r = func(rule, value, o)
    if (r === true) {
      callback()
    } else {
      if (r) {
        rule.message = r
      }
      callback(new Error(r))
    }
  }
}
export const fastMaxLen = function(name, n) {
  const msg = `${name}长度最大${n}`
  return { validator: validator('maxLen', n), message: msg, trigger: ['blur', 'change'] }
}
export const fastNotBlank = function(msg, o) {
  return { validator: validator('notBlank'), message: msg, trigger: ['blur', 'change'] }
}

export default {
  validator, fastNotBlank, fastMaxLen
}
